Skip to content

原因

为什么一定要刷、有没有考虑过其他方案、是不是其他方案都解决不了。

利润报表里的大部分的数据是从 order_statistic[mongo] 表里提取出来的,而现在这个表是按照 orderedtime 下单日期 来统计的。如果想要增加其他两种统计方式的话,必须增加按照其他方式重新生成统计后的数据,并且把这些数据放到新的文档中。为了方便管理,把按照不同统计方法生成的文档放在不同的表中。

SQL或脚本

sql语句:

# 第一步,对于 order_statistics 表,更名为 order_statistics_orderedtime 表
use admin
db.runCommand({renameCollection:"xnn_core_product_0502.order_statistics_new",to:"xnn_core_product_0502.order_statistics_orderedtime"})


# 第二步,新建 order_statistic_cycletime 表,新建 order_statistic_receivedtime 表
use xnn_core_product_0502

db.order_statistics_cycletime.drop()
db.order_statistics_receivedtime.drop()

db.createCollection('order_statistics_cycletime')
db.createCollection('order_statistics_receivedtime')


# 第三步,使用 .py 脚本写入新增的两个表

项目代码改动

  1. 对于原有查询,由「查询 order_statistic 表」改为「查询 order_statistic_orderedtime 表」,逻辑不变
  2. 对于新加的「根据收货时间查询」和「根据周期查询」,按照下面的逻辑写新的查询代码

附:三种查询方式的基本逻辑

  • 根据下单时间查询 在 order_statistic_orderedtime 表内查询 orderedtimestation_id 符合条件的文档

  • 根据运营周期查询 接口获得 time_config_idcycle_start_timecycle_end_time 在 order_statistic_cycletime 表内查询

    • 如果运营周期类型是「预售」:

      query['time_config_id'] = time_config_id query['customer.receive_begin_time'] = {'$gte': receive_begin_time} query['customer.receive_end_time'] = {'$lte': receive_end_time}

      (其中 receive_begin_timereceive_end_time 是算出来的)

    • 如果运营周期类型是「默认」:

      query['time_config_id'] = time_config_id query['date_time'] = {'$gte': date_time_start,'$lt': date_time_end}

      (其中 date_time_startdate_time_end 是算出来的)

  • 根据收货时间查询

    认为某个订单的收货日期是这个订单的 receive_begin_time 所在的日期。 # TODO: 多少没有

    query['customer.receive_begin_time'] = { '$gte': str(receive_start_date), '$lt': str(receive_end_date) }

生成 order_statistic_.* 表的逻辑

order_statistic_orderedtime:

statistics_map[(
    station_id,
    orderedtime,
    salemenu_id
)] = stats
sta_co.insert(statistics_map.values())

order_statistic_cycletime:

statistics_map[(
    station_id,
    orderedtime,
    salemenu_id,
    time_config_id,
    receive_begin_time,
    receive_end_time,
)] = stats
sta_co.insert(statistics_map.values())

order_statistic_receivedtime:


statistics_map[(
    station_id,
    orderedtime,
    salemenu_id
    receive_begin_time,
)] = stats
sta_co.insert(statistics_map.values())

添加索引

order_new:

{
    "status" : 1.0,
    "customer.receive_begin_time" : 1.0,
    "station_id" : 1.0
}

```

Review人

...

Review意见

...

关联业务

数据表关联业务有哪些、如果刷错了、会影响哪些业务。

station|数据中心|利润报表 里的两个报表。 刷错了的话影响的也只有这两个报表。

紧急处理方案

  1. 出现刷错的紧急恢复方案:无
  2. 是否是重要数据:否
  3. 是否需要刷之前先备份数据:否,刷错的话可以按照老脚本再重新生成一遍 order_statistic 表。
  4. 是否需要提供恢复脚本:否